package com.xiaoshuidi.cloud.module.report.dal.DO;

import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.annotation.*;
import com.baomidou.mybatisplus.extension.handlers.AbstractJsonTypeHandler;
import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
import com.xiaoshuidi.cloud.module.report.dal.DO.report.RentFreePeriodDTO;
import lombok.*;

import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.List;

/**
 * 业主合同 DO
 *
 * @author 合房租赁
 */
@TableName(value ="contract_house_owner", autoResultMap = true)
@KeySequence("contract_house_owner_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库，可不写。
@Data
@ToString(callSuper = true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class ContractHouseOwnerDO implements Serializable {

    /**
     * ID
     */
    @TableId
    private Long id;
    /**
     * 合同编号
     */
    private String contractNo;
    /**
     * 审批记录id
     */
    private String processInstanceId;
    /**
     * 审核状态
     * pending 待审批  | pass 审批通过 | reject 审批驳回
     */
    private String approveStatus;
    /**
     * 合同状态
     * pending 待审批 | no_signed 待签约 | active 已生效 | normal_end 正常结束 | abnormal_end 非正常结束
     */
    private String contractStatus;
    /**
     * 合同节点
     *  new 新签  | renewal 续约 | rentingOut 退租 | exchange 换房
     */
    private String contractNode;
    /**
     * 签约时间
     */
    private LocalDateTime signedTime;

    /**
     * 业主会员ID
     */
    private Long memberId;
    /**
     * 业主姓名
     */
    private String ownerName;
    /**
     * 手机号
     */
    private String phone;
    /**
     * 证件类型
     */
    private String idType;
    /**
     * 证件号码
     */
    private String idNumber;

    /**
     * 银行卡号
     */
    private String creditCard;
    /**
     * 所属银行
     */
    private String bank;
    /**
     * 所属支行
     */
    private String branchBank;
    /**
     * 持卡人
     */
    private String cardholder;

    /**
     * 纸质合同编号
     */
    private String offlineNo;
    /**
     * 合同开始时间
     */
    private LocalDate startTime;
    /**
     * 合同结束时间
     */
    private LocalDate endTime;
    /**
     * 押金
     */
    private BigDecimal deposit;
    /**
     * 月租金
     */
    private BigDecimal monthRent;
    /**
     * 支付方式 1月付 3季付 6半年付 12年付 x月付
     */
    private String payMethodF;

    /**
     * 收租类型    advanced提前收租天
     */
    private String rentPayWay;

    /**
     * 提前收租天数
     */
    private Integer advancedDays;

    /**
     * 合同附件
     */
    @TableField(typeHandler = JacksonTypeHandler.class)
    private List<String> contractAnnexUrls;
    /**
     * 证件附件
     */
    @TableField(typeHandler = JacksonTypeHandler.class)
    private List<String> documentAnnexUrls;
    /**
     * 免租期
     */
    @TableField(typeHandler = RentFreePeriodTypeHandler.class)
    private List<RentFreePeriodDTO> rentFreePeriod;
    /**
     * 备注
     */
    private String remarks;

    /**
     * 退租原因
     */
    private String evictionReason;
    /**
     * 退租时间
     */
    private LocalDate evictionTime;
    /**
     * 退租类型
     */
    private String evictionType;
    /**
     * 原业主合同编号
     */
    private Long originalContractId;
    /**
     * 支行省
     */
    private String bankProvince;
    /**
     * 支行市
     */
    private String bankCity;
    /**
     * 支行编码
     */
    private String bankCode;
    /**
     * 续租根合同ID
     */
    private Long rootId;

    @TableField(fill = FieldFill.INSERT)
    private Long deptId;

    /**
     * 合同类型 paper纸质合同 | electronic 电子合同
     */
    private String contractType;

    /**
     * 在线签约状态 signed_party_a 待甲方签约 |signed_party_b 待乙方签约 |signed 已签约 不需要线上签约直接给signed
     */
    private String signStatus;

    /**
     * 电子合同编号
     */
    private String electronicNo;

    /**
     * 联系地址
     */
    private String contactAddress;

    /**
     * 行政地址
     */
    private String administrativeAddress;

    /**
     * 期满延期约定
     */
    private Integer extensionAgreement;

    /**
     * 抵押状态
     */
    private Integer mortgageStatus;

    /**
     * 是否可以饲养宠物
     */
    private Integer feedingPet;

    /**
     * 物业是否正规
     */
    private Integer propertyRegular;

    /**
     * 水表户号
     */
    private String watermeterNum;

    /**
     * 水表初始读数
     */
    private String watermeterInitial;

    /**
     * 电表户号
     */
    private String electricitymeterNum;

    /**
     * 电表初始读数
     */
    private String electricitymeterInitial;

    /**
     * 燃气户号
     */
    private String gasNum;

    /**
     * 燃气初始读数
     */
    private String gasInitial;

    /**
     * 消防设备
     */
    private Integer fireDevice;

    /**
     * 供暖方式
     */
    private Integer heatingMethod;

    /**
     * 紧急联系人姓名
     */
    private String emergencyContactName;

    /**
     * 紧急联系人手机号
     */
    private String emergencyContactPhone;


    /**
     * 平台签约时间
     */
    private LocalDateTime lessorSignTime;
    /**
     * 建行一期业主合同id
     */
    private Long oldId;
    /**
     * 建行一期业主合同首个空置期
     */
    @TableField(value = "firstPeriodMonth")
    private Integer firstPeriodMonth;
    /**
     * 建行一期业主合同次个空置期
     */
    @TableField(value = "secondPeriodMonth")
    private Integer secondPeriodMonth;
    /**
     * 建行一期业主合同委托时长
     */
    @TableField(value = "entrustDate")
    private Integer entrustDate;
    /**
     * 建行一期业主合同空置期周期
     */
    @TableField(value = "eachCycleMonth")
    private Integer eachCycleMonth;
    /**
     * 创建时间
     */
    private LocalDateTime createTime;

    private Long roomId;

    private Long tenantId;

    public static class  RentFreePeriodTypeHandler extends AbstractJsonTypeHandler<List<RentFreePeriodDTO>> {

        @Override
        protected List<RentFreePeriodDTO> parse(String json) {
            return JSON.parseArray(json,RentFreePeriodDTO.class);
        }

        @Override
        protected String toJson(List<RentFreePeriodDTO> obj) {
            return JSON.toJSONString(RentFreePeriodDTO.class);
        }
    }
}


